// #include"Log.hpp"
//  #include "Log(refine).hpp"
#include "ThreadPool.hpp"
#include "Task.hpp"

using namespace ThreadPoolModule;

using func_t = std::function<void()>;

int main()
{
    ThreadPool<func_t>::GetInstance();
    
    // ThreadPool<func_t>::GetInstance()->Enqueue(Download);
    // ThreadPool<func_t>::GetInstance()->Enqueue(Download);


    ThreadPool<func_t>::GetInstance()->Start();

    ThreadPool<func_t>::GetInstance()->Enqueue(Download);
    ThreadPool<func_t>::GetInstance()->Enqueue(Download);
    ThreadPool<func_t>::GetInstance()->Enqueue(Download);
    ThreadPool<func_t>::GetInstance()->Enqueue(Download);

    sleep(5);

    ThreadPool<func_t>::GetInstance()->Stop();
    ThreadPool<func_t>::GetInstance()->Join();

    //非单例模式的线程池使用(需要使用对象)
    // ThreadPool<func_t> tp;

    // tp.Start();

    // tp.Enqueue(Download);
    // tp.Enqueue(Download);
    // tp.Enqueue(Download);


    // sleep(5);
    
    // tp.Stop();

    // tp.Join();
    return 0;
}

template<typename T>
class StarvMode
{
private:
    StarvMode()
    {}
public:
    T& GetInstance()
    {
        return _data;
    }
private:
    static const T _data;
};


// int main()
// {
//     //std::unique_ptr<SyncStrategy> ptr = std::make_unique<ConsoleSyncStrategy>();

//     //Logger(LogLevel::DEBUG , __FILE__ , __LINE__); //这是在调用构造啊安安

//     Logger logger;
//     //logger(LogLevel::DEBUG , __FILE__ , __LINE__) << "安安大宝贝最棒了!!!";
//     LOG(LogLevel::DEBUG) << "安安大宝贝最棒了!!!";

//     //logger.EnableFileSync();
//     EnableFileSyncStrategy();
//     //logger(LogLevel::DEBUG , __FILE__ , __LINE__) << "安安大宝贝最棒了!!!";
//     LOG(LogLevel::DEBUG) << "安安大宝贝最棒了!!!";

//     //Logger(...) << << ;
//     return 0;
// }

// int main()
// {
//     // std::unique_ptr<LogModule::LogStrategy> ptr;

//     // ptr = std::make_unique<LogModule::ConsoleSyncStrategy>();

//     // Logger logger;
//     // logger.EnableConsoleStrategy();
//     // logger(LogLevel::DEBUG , __FILE__ , __LINE__) << "my dear boy!!! you are so wonderful" << "mua";

//     // std::unique_ptr<LogModule::LogStrategy> ptr;

//     // ptr = std::make_unique<LogModule::ConsoleSyncStrategy>();
//     // ptr->Sync("ConsoleSyncStrategy");
//     // ptr->Sync("ConsoleSyncStrategy");
//     // ptr->Sync("ConsoleSyncStrategy");
//     // ptr->Sync("ConsoleSyncStrategy");

//     // ptr = std::make_unique<LogModule::FileSyncStrategy>();
//     // ptr->Sync("FileSyncStrategy");
//     // ptr->Sync("FileSyncStrategy");
//     // ptr->Sync("FileSyncStrategy");
//     // ptr->Sync("FileSyncStrategy");
//     return 0;
// }